#include "GY_TableView.h"
#include <QDebug>

GY_TableView::GY_TableView(QWidget *parent):
    QTableView(parent)
{
    m_pModel = nullptr;
}

/**
 * @brief setColumnCount 设置列数
 * @param columnCount 添加的列数
 */
void GY_TableView::setColumnCount(const int columnCount)
{
    if(columnCount<=0) //设置0列及以下为无效
    {
        return;
    }
    if(!m_pModel){ //如果列表为空
        m_pModel = new QStandardItemModel(this);
        m_pModel->setColumnCount(columnCount);
        QStringList headNames; //创建表名
        for(int i=0; i<columnCount;i++)
        {
            headNames << QString("标题%1").arg(i+1);
        }
        m_pModel->setHorizontalHeaderLabels(headNames); //将表名导入列表中
        this->setModel(m_pModel); //添加m_pModel到treeview中
    }
    else //如果列表存在数据
    {
        QStandardItemModel *pNewModel = new QStandardItemModel(this); //创建一个新的model指针
        pNewModel->setColumnCount(columnCount);
        //设置已有列名
        QStringList headNames;
        for(int i=0;i<columnCount;i++)
        {
            if(i<m_pModel->columnCount())
            {
                headNames<< m_pModel->horizontalHeaderItem(i)->text();
            }
            else
            {
                headNames<< QString("标题%1").arg(i+1);
            }
        }
        pNewModel->setHorizontalHeaderLabels(headNames); //将列名导入列表中

        //设置已有数据
        for(int i=0;i<m_pModel->rowCount();i++)
        {
            QList<QStandardItem*> rowItems;
            QVariant rowId;
            for(int j=0;j<columnCount;j++)
            {
                //设置
                QStandardItem* pNewRowItem = new QStandardItem;
                //判定设置的列数是否少于原列数
                if(j<m_pModel->columnCount())
                {
                    QStandardItem* pOldRowItem = m_pModel->item(i,j);
                    pNewRowItem->setData(pOldRowItem->data());
                    pNewRowItem->setText(pOldRowItem->text()); //后期添加按键，则不能用text格式，需判断一下
                }
                rowItems<< pNewRowItem; //将新行数据依次传入list容器中
            }
            pNewModel->appendRow(rowItems);
        }
        this->setModel(pNewModel);
        delete m_pModel;
        m_pModel = pNewModel;
    }
}

/**
 * @brief addColumn 添加空白列
 * @param columnName 添加的列名
 */
void GY_TableView::addColumn(const QString &columnNmae)
{
    if(columnNmae==nullptr) //设置列名为空无效
    {
        return;
    }
    if(!m_pModel) //如果列表为空
    {
        m_pModel = new QStandardItemModel(this);
    }
    int column = m_pModel->columnCount();
    m_pModel->setColumnCount(column+1);
    QStandardItem* pItem = new QStandardItem(columnNmae);
    m_pModel->setHorizontalHeaderItem(column,pItem); //将添加的列名放在列表后
    this->setModel(m_pModel);
}

/**
 * @brief addColumnData 添加列数据
 * @param index 索引第几列
 * @param Data 要添加的数据
 */
void GY_TableView::addColumnData(const QString &columnNmae, const QVector<QVariant> &columnData)
{
    if(columnNmae==nullptr || !columnData.size()) //添加列数据无效
    {
        return;
    }
    if(!m_pModel) //如果列表为空
    {
        m_pModel = new QStandardItemModel(this);
    }
    int rowCount = qMax(m_pModel->rowCount(),columnData.size());
    QList<QStandardItem*> rowItems;
    for(int i=0;i<rowCount;i++)
    {
        QStandardItem* pItem= new QStandardItem();
        if(i<columnData.size()) //如果插入的列数据的数量大于行数
        {
            pItem->setData(columnData[i]);
            pItem->setText(columnData[i].toString());
        }
        rowItems<<pItem;
    }
    m_pModel->appendColumn(rowItems);
    QStandardItem* pNameItem = new QStandardItem(columnNmae);
    m_pModel->setHorizontalHeaderItem(m_pModel->columnCount()-1,pNameItem); //将添加的列名放在列表后
    this->setModel(m_pModel);
}

/**
 * @brief insterColumn 插入列
 * @param index 插入在第几列
 * @param columnName 插入的列名
 * @return 返回插入列是否成功
 */
bool GY_TableView::insterColumn(const int index, const QString &columnName)
{
    if(!m_pModel || index<0 || index>m_pModel->columnCount()){
        return false;
    }
    else
    {
        QList<QStandardItem*> listItem;
        for(int i=0;i<m_pModel->rowCount();i++)
        {
            QStandardItem* pRowItem = m_pModel->item(i);
            listItem<<pRowItem;
        }
        m_pModel->insertColumn(index,listItem);
        QStandardItem* pitem = new QStandardItem(columnName);
        m_pModel->setHorizontalHeaderItem(index,pitem);
        this->setModel(m_pModel);
        return true;
    }
}

/**
 * @brief deleteColumn 删除列
 * @param index 删除的第几列
 * @return 返回删除列是否成功
 */
bool GY_TableView::deleteColumn(const int index)
{
    if(m_pModel==nullptr ||index<0 || index>m_pModel->columnCount())
    {
        return false;
    }
    m_pModel->takeColumn(index);
    this->setModel(m_pModel);
    return true;
}

/**
 * @brief setColumnHeadName  设置列头名称
 * @param nameList  要修改的列名集
 */
void GY_TableView::setColumnHeadName(const QStringList &nameList)
{
    if(nameList.size()<0 || !m_pModel)
    {
        return;
    }
    QStringList headNames;
    for(int i=0;i<m_pModel->columnCount();i++)
    {
        if(i<nameList.size())//如果原列表列数小于新设置的列名数量
        {
            headNames<< nameList.at(i);
        }
        else
        {
            headNames<< m_pModel->horizontalHeaderItem(i)->text();//将原列表列名补充进新列名中
        }
    }
    m_pModel->setHorizontalHeaderLabels(headNames); //将列名导入列表中
}

/**
 * @brief setColumnHeadName  修改某一列列名
 * @param index  要修改名字在第几列
 * @param headName  要修改成的名字
 */
void GY_TableView::setColumnHeadName(const int index, const QString &headName)
{
    QStandardItem* pitem = new QStandardItem(headName);
    m_pModel->setHorizontalHeaderItem(index,pitem); //索引修改列名
}

/**
 * @brief getColumnData 获取列数据
 * @param columnIndex 索引第几列
 * @return 返回列数据
 */
QVector<QVariant> GY_TableView::getColumnData(const int columnIndex)
{
    if(columnIndex<0 || columnIndex>m_pModel->columnCount() || !m_pModel)
    {
        return QVector<QVariant>();
    }
    QVector<QVariant> columnDataVec; //存储列数据
    for(int i=0;i<m_pModel->rowCount();i++)
    {
        columnDataVec<< m_pModel->item(i,columnIndex)->data();
    }
    return columnDataVec;
}

/**
 * @brief addRowData 添加行数据
 * @return 是否添加成功
 */
bool GY_TableView::addRowData(const QVector<QVariant> &rowData)
{
    if(!rowData.size()||!m_pModel||!m_pModel->columnCount())
    {
        return false;
    }
    QList<QStandardItem*> rowItems; //用list容器存储item
    for(int i=0;i<m_pModel->columnCount();i++)
    {
        QStandardItem* pItem=new QStandardItem;
        if(i<rowData.size()) //如果插入的行数据的数量大于列数
        {
            pItem->setData(rowData[i]);
            pItem->setText(rowData[i].toString());
        }
        rowItems<<pItem;
    }
    m_pModel->appendRow(rowItems); //添加行
    return true;
}

/**
 * @brief insertRowData 插入行数据
 * @param rowIndex 索引第几行
 * @param rowData 插入的行数据
 * @return 是否插入成功
 */
bool GY_TableView::insertRowData(const int rowIndex, const QVector<QVariant> &rowData)
{
    if(!rowData.size()||!m_pModel||!m_pModel->columnCount()) //插入行数据无效
    {
        return false;
    }
    QList<QStandardItem*> rowItems; //用list容器存储item
    for(int i=0;i<m_pModel->columnCount();i++)
    {
        QStandardItem* pItem=new QStandardItem;
        if(i<rowData.size())
        {
            pItem->setData(rowData[i]);
            pItem->setText(rowData[i].toString());
        }
        rowItems<<pItem;
    }
    m_pModel->insertRow(rowIndex,rowItems);
    return true;
}

/**
 * @brief deleteRow 删除指定行
 * @param rowIndex 删除第几行
 * @return 返回删除是否成功
 */
bool GY_TableView::deleteRow(const int rowIndex)
{
    if(rowIndex<0) //当rowIndex小于0，则删除无效
    {
        return false;
    }
    m_pModel->removeRow(rowIndex);
    return true;
}

/**
 * @brief setRowData  修改行数据
 * @param rowIndex  修改第几行
 * @param rowData  要修改的数据
 * @return 是否修改成功
 */
bool GY_TableView::setRowData(const int rowIndex, const QVector<QVariant> &rowData)
{
    if(rowIndex<0 || !rowData.size()) //修改行数据无效
    {
        return false;
    }
    QList<QStandardItem*> rowItems; //用list容器存储新item
    for(int j=0;j<m_pModel->columnCount();j++)
    {
        QStandardItem* pNewRowItem = m_pModel->item(rowIndex,j);
        if(j<rowData.size()) //如果修改的行数据数量小于model的列数
        {
            pNewRowItem->setData(rowData.at(j));
            pNewRowItem->setText(rowData.at(j).toString());
        }
        rowItems<<pNewRowItem;
    }
    return true;
}

/**
 * @brief setCellData  修改单元格数据
 * @param rowIndex  修改第几行
 * @param columnIndex  修改第几列
 * @param cellData  要修改的数据
 * @return 是否修改成功
 */
bool GY_TableView::setCellData(const int rowIndex, const int columnIndex, const QVariant &cellData)
{
    if(rowIndex<0 || columnIndex<0) //修改单元格无效
    {
        return false;
    }
    QStandardItem* pItem = m_pModel->item(rowIndex,columnIndex); //通过rowIndex和columnIndex查找出对应的item
    pItem->setData(cellData); //将cellData赋值给pitem
    pItem->setText(cellData.toString());
    return true;
}

/**
 * @brief getRowData 获取行数据
 * @param rowIndex 索引第几行
 * @return 返回对应行数据
 */
QVector<QVariant> GY_TableView::getRowData(const int rowIndex)
{
    QVector<QVariant> rowDataVec;
    if(rowIndex<0 || rowIndex>m_pModel->columnCount() || !m_pModel)
    {
        return rowDataVec;
    }
    for(int i=0;i<m_pModel->columnCount();i++)
    {
        rowDataVec<< m_pModel->item(rowIndex,i)->data();
    }
    return rowDataVec;
}

/**
 * @brief setTextLeft 设置文字居左显示
 * @param rowIndex 索引第几行
 */
void GY_TableView::setTextLeft(const int rowIndex)
{
    if(rowIndex<0 ||!m_pModel || m_pModel->columnCount()<0) //设置文字无效
    {
        return;
    }
    for(int i=0;i<m_pModel->columnCount();i++)
    {
        QStandardItem* pItem = m_pModel->item(rowIndex,i);
        pItem->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); //设置文字左对齐方式
    }
}

/**
 * @brief setTextRight 设置文字居右显示
 * @param rowIndex 索引第几行
 */
void GY_TableView::setTextRight(const int rowIndex)
{
    if(rowIndex<0 ||!m_pModel || m_pModel->columnCount()<0) //如果rowIndex小于0，设置文字无效
    {
        return;
    }
    for(int i=0;i<m_pModel->columnCount();i++)
    {
        QStandardItem* pItem = m_pModel->item(rowIndex,i);
        pItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); //设置文字右对齐方式
    }
}

/**
 * @brief setTextCenter 设置文字居中显示
 * @param rowIndex 索引第几行
 */
void GY_TableView::setTextCenter(const int rowIndex)
{
    if(rowIndex<0) //如果rowIndex小于0，设置文字无效
    {
        return;
    }
    for(int i=0;i<m_pModel->columnCount();i++)
    {
        QStandardItem* pItem = m_pModel->item(rowIndex,i);
        pItem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //设置文字居中对齐方式
    }
}

/**
 * @brief setTextBold 设置文字加粗显示
 * @param rowIndex 索引第几行
 * @param ischeck 是否加粗
 */
void GY_TableView::setTextBold(const int rowIndex, bool ischeck)
{
    if(rowIndex<0) //如果rowIndex小于0，设置文字无效
    {
        return;
    }
    for(int i=0;i<m_pModel->columnCount();i++)
    {
        QStandardItem* pItem = m_pModel->item(rowIndex,i);
        QFont font = pItem->font(); //获取字体
        font.setBold(ischeck); //设置字体是否加粗
        pItem->setFont(font); //重新设置字体
    }
}

/**
 * @brief setRowDropDownBox 设置行表格下拉框
 * @param rowIndex 索引第几行
 * @param data 下拉框中的数据
 */
void GY_TableView::setRowDropDownBox(const int rowIndex, const QStringList &data)
{

}

/**
 * @brief setColumnDropDownBox 设置列表格下拉框
 * @param rowIndex 索引第几列
 * @param data 下拉框中的数据
 */
void GY_TableView::setColumnDropDownBox(const int columnIndex, const QStringList &data)
{

}

/**
 * @brief setButton 设置表格按钮
 * @param roeIndex 索引第几行
 * @param columnIndex 索引第几列
 * @param data 按钮上的文字
 */
void GY_TableView::setButton(const int roeIndex, const int columnIndex, const QString &data, void (*callBack)())
{

}

/**
 * @brief clearData 清除所有数据
 */
void GY_TableView::clearData()
{
    m_pModel->clear();
}

/**
 * @brief openCsv 打开Csv文件读取
 * @param data 文件名称
 */
void GY_TableView::openCsv(const QString &data)
{

}

/**
 * @brief saveCsv 表格数据保存到csv
 * @param data 文件名称
 */
void GY_TableView::saveCsv(const QString &data)
{

}
